Temperature, Salinity, and Stratification¶
import xarray as xr
from matplotlib import pyplot as plt
from IPython.display import SVG, display, Image, display_svg
import numpy as np
import gsw
%matplotlib inline
import holoviews as hv
from holoviews.operation.datashader import regrid
hv.extension('bokeh')
plt.rcParams['figure.figsize'] = (12,7)
# masks
woa_mask = xr.open_dataset('http://iridl.ldeo.columbia.edu/SOURCES/.NOAA/.NODC/.WOA09/'
'.Masks/.basin/dods/').rename({'X':'lon', 'Y':'lat', 'Z': 'depth'})
basin_names = woa_mask.basin.attrs['CLIST'].split('\n')
basins_main = { n: basin_names[n-1] for n in [1,2,3,10] }
basins_marginal = { n: basin_names[n-1] for n in [4,5,6,7,11] }
# data
url_base = 'http://iridl.ldeo.columbia.edu/SOURCES/.NOAA/.NODC/.WOA09/.Grid-1x1/.Annual'
url_temp = url_base + '/.temperature/.t_an/dods'
url_salt = url_base + '/.salinity/.s_an/dods '
woa_temp = xr.open_dataset(url_temp)
woa_temp_nobs = xr.open_dataarray(url_base + '/.temperature/.t_dd/dods')
woa_salt = xr.open_dataset(url_salt)
woa = xr.merge([woa_temp, woa_salt, woa_temp_nobs, woa_mask]).isel(time=0)
woa.load()
<xarray.Dataset>
Dimensions: (depth: 33, lat: 180, lon: 360)
Coordinates:
* lon (lon) float32 0.5 1.5 2.5 3.5 4.5 ... 355.5 356.5 357.5 358.5 359.5
* depth (depth) float32 0.0 10.0 20.0 30.0 ... 4000.0 4500.0 5000.0 5500.0
* lat (lat) float32 -89.5 -88.5 -87.5 -86.5 -85.5 ... 86.5 87.5 88.5 89.5
time datetime64[ns] 2008-01-01
Data variables:
t_an (depth, lat, lon) float32 nan nan nan nan nan ... nan nan nan nan
s_an (depth, lat, lon) float32 nan nan nan nan nan ... nan nan nan nan
t_dd (depth, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
basin (depth, lat, lon) float32 nan nan nan nan nan ... nan nan nan nan
pres = gsw.p_from_z(-woa.depth, 0)[:,None,None]
s_a = gsw.SA_from_SP(woa.s_an,
pres,
woa.lon.data[None,None,:],
woa.lat.data[None,:,None])
c_t = gsw.CT_from_t(s_a, woa.t_an, pres)
sigma_0 = gsw.sigma0(s_a, c_t)
sigma_2 = gsw.sigma2(s_a, c_t)
sigma_4 = gsw.sigma4(s_a, c_t)
for data, label in ((s_a, 's_a'), (c_t, 'c_t'),
(sigma_0, 'sigma_0'), (sigma_2, 'sigma_2'), (sigma_4, 'sigma_4')):
woa[label] = xr.DataArray(data, dims=woa.t_an.dims, coords=woa.t_an.coords)
woa
<xarray.Dataset>
Dimensions: (depth: 33, lat: 180, lon: 360)
Coordinates:
* lon (lon) float32 0.5 1.5 2.5 3.5 4.5 ... 355.5 356.5 357.5 358.5 359.5
* depth (depth) float32 0.0 10.0 20.0 30.0 ... 4000.0 4500.0 5000.0 5500.0
* lat (lat) float32 -89.5 -88.5 -87.5 -86.5 -85.5 ... 86.5 87.5 88.5 89.5
time datetime64[ns] 2008-01-01
Data variables:
t_an (depth, lat, lon) float32 nan nan nan nan nan ... nan nan nan nan
s_an (depth, lat, lon) float32 nan nan nan nan nan ... nan nan nan nan
t_dd (depth, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
basin (depth, lat, lon) float32 nan nan nan nan nan ... nan nan nan nan
s_a (depth, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
c_t (depth, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
sigma_0 (depth, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
sigma_2 (depth, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
sigma_4 (depth, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
%%opts Image [logz=True width=700 height=400 colorbar=True toolbar='above']
hv.Dataset(woa.t_dd).to(hv.Image, ['lon', 'lat'], label='Number of Observations')